RxJava2.0

您所在的位置:网站首页 rxjava map原理 RxJava2.0

RxJava2.0

2023-10-05 17:01| 来源: 网络整理| 查看: 265

前言

终于到了讲RxJava这一期,RxJava是笔者个人非常喜欢的一个开源库,它很好的将链式编程风格和异步结合在一起。RxJava其实已经推出很久了,可以说是已经很火了,但是目前仍然还有相当一部分Android开发者没有使用过,甚至说是想用,却不知道怎么用,或者不知道自己的项目哪里可以用到,本着让广大开发者理解并且上手项目,从放弃到入门,故推出这边文章。

注:本文所有的具体代码实现都在文章最后的github链接上

学习RxJava2.0之前需不需要学习RxJava1.0

首先,RxJava1.0和RxJava2.0的核心思想都是观察者模式,只不过RxJava2.0在RxJava1.0的基础对一些方法进行了优化,方便于开发者更好地理解其编程思想,同时又增加了一部分新的方法解决1.0存在的问题,例如背压等。所以,如果你学习过RxJava1.0那么很好,你可能已经理解了什么是观察者模式;如果你没有学过RxJava1.0,当然也不必着急,因为本文将从最基本的观察者模式讲起,让你从最基本最简单的角度入手RxJava。综上所述,不管你是不是学过RxJava1.0,都不会影响你学习本篇文章。

观察者模式

在学习RxJava2.0之前,我们必须要弄明白什么是观察者模式。按照我的惯例,先上一个百度百科的权威介绍

百度百科的观察者模式介绍

简单介绍一下,A和B两个,A是被观察者,B是观察者,B对A进行观察,B并不是需要时刻盯着A,而是A如果发生了变化,会主动通知B,B会对应做一些变化。举个例子,假设A是连载小说,B是读者,读者订阅了连载小说,当小说出现了新的连载的时候,会推送给读者。读者不用时刻盯着小说连载,而小说有了新的连载会主动推送给读者。这就是观察者模式。而RxJava正是基于观察者模式开发的。

观察者模式.png RxJava2.0的基本使用

理解好了观察者模式,我们开始RxJava2.0的学习。首先引入RxJava2.0相关的类库。 compile 'io.reactivex.rxjava2:rxjava:2.0.1'

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

正确使用姿势:

第一步:创建连载小说(被观察者)

//被观察者 Observable novel=Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext("连载1"); emitter.onNext("连载2"); emitter.onNext("连载3"); emitter.onComplete(); } });

Observable中文意思就是被观察者,通过create方法生成对象,里面放的参数ObservableOnSubscribe,可以理解为一个计划表,泛型T是要操作对象的类型,重写subscribe方法,里面写具体的计划,本文的例子就是推送连载1、连载2和连载3,在subscribe中的ObservableEmitter对象的Emitter是发射器的意思。ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void onError(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。

第二步:创建读者(观察者)

//观察者 Observer reader=new Observer() { @Override public void onSubscribe(Disposable d) { mDisposable=d; Log.e(TAG,"onSubscribe"); } @Override public void onNext(String value) { if ("2".equals(value)){ mDisposable.dispose(); return; } Log.e(TAG,"onNext:"+value); } @Override public void onError(Throwable e) { Log.e(TAG,"onError="+e.getMessage()); } @Override public void onComplete() { Log.e(TAG,"onComplete()"); } };

通过new创建接口,并实现其内部的方法,看方法其实就应该差不多知道干嘛的,onNext、onError、onComplete都是跟被观察者发射的方法一一对应的,这里就相当于接收了。onSubscribe(Disposable d)里面的Disposable对象要说一下,Disposable英文意思是可随意使用的,这里就相当于读者和连载小说的订阅关系,如果读者不想再订阅该小说了,可以调用 mDisposable.dispose()取消订阅,此时连载小说更新的时候就不会再推送给读者了。

第三步:读者和连载小说建立订阅关系

novel.subscribe(reader);//一行代码搞定

在这里细心的你,可能已经发现了怎么是小说订阅了读者,之所以这样,是因为RxJava主要是想保持自己的链式编程,不得不把Observable(被观察者)放在前面,这里大家可以理解为小说被读者订阅了。

这里我们先看一下输出效果

输出效果

小结一下:这就是RxJava2.0最最简单的用法,创建小说,创建读者,建立订阅关系,记住这三步,你就能实现一个最简单的RxJava2.0的用法。

RxJava2.0的异步和链式编程

前言里面有提到,RxJava是支持异步的,但是RxJava是如何做到的呢?这里就需要Scheduler。Scheduler,英文名调度器,它是RxJava用来控制线程。当我们没有设置的时候,RxJava遵循哪个线程产生就在哪个线程消费的原则,也就是说线程不会产生变化,始终在同一个。然后我们一般使用RxJava都是后台执行,前台调用,本着这个原则,我们需要调用observeOn(AndroidSchedulers.mainThread()),observeOn是事件回调的线程,AndroidSchedulers.mainThread()一看就知道是主线程,subscribeOn(Schedulers.io()),subscribeOn是事件执行的线程,Schedulers.io()是子线程,这里也可以用Schedulers.newThread(),只不过io线程可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。前面的代码根据异步和链式编程的原则,我们可以写成

Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext("连载1"); emitter.onNext("连载2"); emitter.onNext("连载3"); emitter.onComplete(); } }) .observeOn(AndroidSchedulers.mainThread())//回调在主线程 .subscribeOn(Schedulers.io())//执行在io线程 .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { Log.e(TAG,"onSubscribe"); } @Override public void onNext(String value) { Log.e(TAG,"onNext:"+value); } @Override public void onError(Throwable e) { Log.e(TAG,"onError="+e.getMessage()); } @Override public void onComplete() { Log.e(TAG,"onComplete()"); } });

这里就是RxJava最常用的写法,异步+链式编程,还要再说一下,subscribe的方法重载,subscribe()方法里什么参数也不放是空实现,也就是说连载小说无论出什么连载,读者都不关心,推送过来了也不读,如果读者只关心onNext方法里的内容,可以直接重载subscribe(Consumer



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3